home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / misc / dspice0s / tmpupd.c < prev    next >
C/C++ Source or Header  |  1992-11-21  |  28KB  |  715 lines

  1. /* tmpupd.f -- translated by f2c (version of 3 February 1990  3:36:42).
  2.    You must link the resulting object file with the libraries:
  3.     -lF77 -lI77 -lm -lc   (in that order)
  4. */
  5.  
  6. #include "f2c.h"
  7.  
  8. /* Common Block Declarations */
  9.  
  10. struct {
  11.     integer ielmnt, isbckt, nsbckt, iunsat, nunsat, itemps, numtem, isens, 
  12.         nsens, ifour, nfour, ifield, icode, idelim, icolum, insize, 
  13.         junode, lsbkpt, numbkp, iorder, jmnode, iur, iuc, ilc, ilr, 
  14.         numoff, isr, nmoffc, iseq, iseq1, neqn, nodevs, ndiag, iswap, 
  15.         iequa, macins, lvnim1, lx0, lvn, lynl, lyu, lyl, lx1, lx2, lx3, 
  16.         lx4, lx5, lx6, lx7, ld0, ld1, ltd, imynl, imvn, lcvn, nsnod, 
  17.         nsmat, nsval, icnod, icmat, icval, loutpt, lpol, lzer, irswpf, 
  18.         irswpr, icswpf, icswpr, irpt, jcpt, irowno, jcolno, nttbr, nttar, 
  19.         lvntmp;
  20. } tabinf_;
  21.  
  22. #define tabinf_1 tabinf_
  23.  
  24. struct {
  25.     doublereal atime, aprog[3], adate, atitle[10], defl, defw, defad, defas, 
  26.         rstats[50];
  27.     integer iwidth, lwidth, nopage;
  28. } miscel_;
  29.  
  30. #define miscel_1 miscel_
  31.  
  32. struct {
  33.     integer locate[50], jelcnt[50], nunods, ncnods, numnod, nstop, nut, nlt, 
  34.         nxtrm, ndist, ntlin, ibr, numvs, numalt, numcyc;
  35. } cirdat_;
  36.  
  37. #define cirdat_1 cirdat_
  38.  
  39. struct {
  40.     doublereal omega, time, delta, delold[7], ag[7], vt, xni, egfet, xmu, 
  41.         sfactr;
  42.     integer mode, modedc, icalc, initf, method, iord, maxord, noncon, iterno, 
  43.         itemno, nosolv, modac, ipiv, ivmflg, ipostp, iscrch, iofile;
  44. } status_;
  45.  
  46. #define status_1 status_
  47.  
  48. struct {
  49.     doublereal twopi, xlog2, xlog10, root2, rad, boltz, charge, ctok, gmin, 
  50.         reltol, abstol, vntol, trtol, chgtol, eps0, epssil, epsox, pivtol,
  51.          pivrel;
  52. } knstnt_;
  53.  
  54. #define knstnt_1 knstnt_
  55.  
  56. struct {
  57.     doublereal value[200000];
  58. } blank_;
  59.  
  60. #define blank_1 blank_
  61.  
  62. /* Table of constant values */
  63.  
  64. static integer c__0 = 0;
  65. static integer c__1 = 1;
  66.  
  67. /*<       subroutine tmpupd >*/
  68. /* Subroutine */ int tmpupd_()
  69. {
  70.     /* Initialized data */
  71.  
  72.     static struct {
  73.     char e_1[32];
  74.     doublereal e_2;
  75.     } equiv_64 = { {'t', 'e', 'm', 'p', 'e', 'r', 'a', 't', 'u', 'r', 'e',
  76.          '-', 'a', 'd', 'j', 'u', 's', 't', 'e', 'd', ' ', 'v', 'a', 
  77.         'l', 'u', 'e', 's', ' ', ' ', ' ', ' ', ' '}, 0. };
  78.  
  79. #define tmptit ((doublereal *)&equiv_64)
  80.  
  81.  
  82.     /* Format strings */
  83.     static char fmt_21[] = "(//\0020**** resistors\002,/,\0020name\002,8x\
  84. ,\002value\002,//)";
  85.     static char fmt_31[] = "(1x,a8,1p6d11.3)";
  86.     static char fmt_101[] = "(//\0020**** diode model parameters\002,/,\0020\
  87. name\002,9x,\002is\002,9x,\002vj\002,8x,\002cjo\002,//)";
  88.     static char fmt_201[] = "(//\0020**** bjt model parameters\002,/,\0020na\
  89. me\002,9x,\002js\002,8x,\002bf \002,7x,\002ise\002,7x,\002br \002,7x,\002is\
  90. c\002,7x,\002vje\002,7x,\002cje\002,7x,\002vjc\002,7x,\002cjc\002,//)";
  91.     static char fmt_211[] = "(1x,a8,1p9d10.3)";
  92.     static char fmt_301[] = "(//\0020**** jfet model parameters\002,/,\0020n\
  93. ame\002,9x,\002is\002,9x,\002pb\002,8x,\002cgs\002,8x,\002cgd\002,//)";
  94.     static char fmt_401[] = "(//\0020**** mosfet model parameters\002,/,\002\
  95. 0name\002,8x,\002vto\002,8x,\002phi\002,9x,\002pb\002,7x,\002is(js)\002,7x\
  96. ,\002kp\002,9x,\002uo\002//)";
  97.  
  98.     /* System generated locals */
  99.     doublereal d_1, d_2;
  100.  
  101.     /* Builtin functions */
  102.     double log(), sqrt(), exp();
  103.     integer s_wsfe(), e_wsfe(), do_fio();
  104.  
  105.     /* Local variables */
  106.     static doublereal delt, csat, phio;
  107.     static integer locv;
  108.     static doublereal rnew, type, fact1, fact2, temp1, temp2, oldeg, oldpb, 
  109.         dtemp, pbrat, ratio, oldvt;
  110.     extern /* Subroutine */ int title_();
  111.     static integer iprnt;
  112.     static doublereal egfet1, pbfat1, ratio1, ratio4, tb, cjfact, pbfact, 
  113.         bfactr, oldcjf, gmaold, xn;
  114. #define nodplc ((integer *)&blank_1)
  115. #define cvalue ((complex *)&blank_1)
  116.     static doublereal reftmp, ratlog, deltsq, vt1;
  117.     static integer ititle;
  118.     static doublereal tc1, tc2, factor, gmanew, factln, oldphi, arg, coeold, 
  119.         coenew;
  120.     static integer loc;
  121.     static doublereal vfb, pbo, phi, vte, xkt, arg1, xkt1;
  122.  
  123.     /* Fortran I/O blocks */
  124.     static cilist io__30 = { 0, 0, 0, fmt_21, 0 };
  125.     static cilist io__32 = { 0, 0, 0, fmt_31, 0 };
  126.     static cilist io__33 = { 0, 0, 0, fmt_101, 0 };
  127.     static cilist io__42 = { 0, 0, 0, fmt_31, 0 };
  128.     static cilist io__43 = { 0, 0, 0, fmt_201, 0 };
  129.     static cilist io__47 = { 0, 0, 0, fmt_211, 0 };
  130.     static cilist io__48 = { 0, 0, 0, fmt_301, 0 };
  131.     static cilist io__51 = { 0, 0, 0, fmt_31, 0 };
  132.     static cilist io__54 = { 0, 0, 0, fmt_401, 0 };
  133.     static cilist io__63 = { 0, 0, 0, fmt_31, 0 };
  134.  
  135.  
  136. /*<       implicit double precision (a-h,o-z) >*/
  137.  
  138. /*     this routine updates the temperature-dependent parameters in the */
  139.  
  140. /* device models.  it also updates the values of temperature-dependent */
  141. /* resistors.  the updated values are printed. */
  142.  
  143. /* spice version 2g.6  sccsid=tabinf 3/15/83 */
  144. /*<       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, >*/
  145. /*<      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, >*/
  146. /*<      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, >*/
  147. /*<      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, >*/
  148. /*<      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, >*/
  149. /*<      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval, >*/
  150. /*<      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt, >*/
  151. /*<      7   irowno,jcolno,nttbr,nttar,lvntmp >*/
  152. /* spice version 2g.6  sccsid=miscel 3/15/83 */
  153. /*<       common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, >*/
  154. /*<      1  defas,rstats(50),iwidth,lwidth,nopage >*/
  155. /* spice version 2g.6  sccsid=cirdat 3/15/83 */
  156. /*<       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, >*/
  157. /*<      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc >*/
  158. /* spice version 2g.6  sccsid=status 3/15/83 */
  159. /*<       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, >*/
  160. /*<      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon, >*/
  161. /*<      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile >*/
  162. /* spice version 2g.6  sccsid=knstnt 3/15/83 */
  163. /*<       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, >*/
  164. /*<      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox, >*/
  165. /*<      2   pivtol,pivrel >*/
  166. /* spice version 2g.6  sccsid=blank 3/15/83 */
  167. /*<       common /blank/ value(200000) >*/
  168. /*<       integer nodplc(64) >*/
  169. /*<       complex cvalue(32) >*/
  170. /*<       equivalence (value(1),nodplc(1),cvalue(1)) >*/
  171.  
  172.  
  173. /*<       dimension tmptit(4) >*/
  174. /*<       data tmptit / 8htemperat, 8hure-adju, 8hsted val, 8hues      / >*/
  175.  
  176.  
  177. /*<       reftmp=27.0d0+ctok >*/
  178.     reftmp = knstnt_1.ctok + 27.;
  179. /*<       temp1=value(itemps+itemno-1)+ctok >*/
  180.     temp1 = blank_1.value[tabinf_1.itemps + status_1.itemno - 2] + 
  181.         knstnt_1.ctok;
  182. /*<       temp2=value(itemps+itemno)+ctok >*/
  183.     temp2 = blank_1.value[tabinf_1.itemps + status_1.itemno - 1] + 
  184.         knstnt_1.ctok;
  185. /*<       xkt=boltz*temp2 >*/
  186.     xkt = knstnt_1.boltz * temp2;
  187. /*<       oldvt=vt >*/
  188.     oldvt = status_1.vt;
  189. /*<       vt=xkt/charge >*/
  190.     status_1.vt = xkt / knstnt_1.charge;
  191. /*<       oldeg=egfet >*/
  192.     oldeg = status_1.egfet;
  193. /*<       egfet=1.16d0-(7.02d-4*temp2*temp2)/(temp2+1108.0d0) >*/
  194.     status_1.egfet = 1.16 - temp2 * 7.02e-4 * temp2 / (temp2 + 1108.);
  195. /*<       arg=-egfet/(xkt+xkt)+1.1150877d0/(boltz*(reftmp+reftmp)) >*/
  196.     arg = -status_1.egfet / (xkt + xkt) + 1.1150877 / (knstnt_1.boltz * (
  197.         reftmp + reftmp));
  198. /*<       ratio=temp2/temp1 >*/
  199.     ratio = temp2 / temp1;
  200. /*<       ratlog=dlog(ratio) >*/
  201.     ratlog = log(ratio);
  202. /*<       ratio1=ratio-1.0d0 >*/
  203.     ratio1 = ratio - 1.;
  204. /*<       dtemp=temp2-reftmp >*/
  205.     dtemp = temp2 - reftmp;
  206. /*<       delt=value(itemps+itemno)-value(itemps+1) >*/
  207.     delt = blank_1.value[tabinf_1.itemps + status_1.itemno - 1] - 
  208.         blank_1.value[tabinf_1.itemps];
  209. /*<       deltsq=delt*delt >*/
  210.     deltsq = delt * delt;
  211. /*<       fact2=temp2/reftmp >*/
  212.     fact2 = temp2 / reftmp;
  213. /*<       xni=1.45d16*fact2*dsqrt(fact2)*dexp(charge*arg) >*/
  214.     status_1.xni = fact2 * 1.45e16 * sqrt(fact2) * exp(knstnt_1.charge * arg);
  215.  
  216. /*<       pbfact=-2*vt*(1.5d0*dlog(fact2)+charge*arg) >*/
  217.     pbfact = status_1.vt * -2 * (log(fact2) * 1.5 + knstnt_1.charge * arg);
  218. /*<       xkt1=boltz*temp1 >*/
  219.     xkt1 = knstnt_1.boltz * temp1;
  220. /*<       vt1=xkt1/charge >*/
  221.     vt1 = xkt1 / knstnt_1.charge;
  222. /*<       egfet1=1.16d0-(7.02d-4*temp1*temp1)/(temp1+1108.0d0) >*/
  223.     egfet1 = 1.16 - temp1 * 7.02e-4 * temp1 / (temp1 + 1108.);
  224. /*<       arg1=-egfet1/(xkt1+xkt1)+1.1150877d0/(boltz*(reftmp+reftmp)) >*/
  225.     arg1 = -egfet1 / (xkt1 + xkt1) + 1.1150877 / (knstnt_1.boltz * (reftmp + 
  226.         reftmp));
  227. /*<       fact1=temp1/reftmp >*/
  228.     fact1 = temp1 / reftmp;
  229. /*<       pbfat1=-2*vt1*(1.5d0*dlog(fact1)+charge*arg1) >*/
  230.     pbfat1 = vt1 * -2 * (log(fact1) * 1.5 + knstnt_1.charge * arg1);
  231. /*<     5 call title(0,lwidth,1,tmptit) >*/
  232. /* L5: */
  233.     title_(&c__0, &miscel_1.lwidth, &c__1, tmptit);
  234.  
  235. /*  resistors */
  236.  
  237. /*<       loc=locate(1) >*/
  238.     loc = cirdat_1.locate[0];
  239. /*<       ititle=0 >*/
  240.     ititle = 0;
  241. /*<    10 if (loc.eq.0) go to 100 >*/
  242. L10:
  243.     if (loc == 0) {
  244.     goto L100;
  245.     }
  246. /*<       locv=nodplc(loc+1) >*/
  247.     locv = nodplc[loc];
  248. /*<       tc1=value(locv+3) >*/
  249.     tc1 = blank_1.value[locv + 2];
  250. /*<       tc2=value(locv+4) >*/
  251.     tc2 = blank_1.value[locv + 3];
  252. /*<       if (tc1.ne.0.0d0) go to 20 >*/
  253.     if (tc1 != 0.) {
  254.     goto L20;
  255.     }
  256. /*<       if (tc2.eq.0.0d0) go to 40 >*/
  257.     if (tc2 == 0.) {
  258.     goto L40;
  259.     }
  260. /*<    20 if (ititle.ne.0) go to 30 >*/
  261. L20:
  262.     if (ititle != 0) {
  263.     goto L30;
  264.     }
  265. /*<       write (iofile,21) >*/
  266.     io__30.ciunit = status_1.iofile;
  267.     s_wsfe(&io__30);
  268.     e_wsfe();
  269. /*<    21 format(//'0**** resistors',/,'0name',8x,'value',//) >*/
  270. /*<       ititle=1 >*/
  271.     ititle = 1;
  272. /*<    30 rnew=value(locv+2)*(1.0d0+tc1*delt+tc2*deltsq) >*/
  273. L30:
  274.     rnew = blank_1.value[locv + 1] * (tc1 * delt + 1. + tc2 * deltsq);
  275. /*<       value(locv+1)=1.0d0/rnew >*/
  276.     blank_1.value[locv] = 1. / rnew;
  277. /*<       write (iofile,31) value(locv),rnew >*/
  278.     io__32.ciunit = status_1.iofile;
  279.     s_wsfe(&io__32);
  280.     do_fio(&c__1, (char *)&blank_1.value[locv - 1], (ftnlen)sizeof(doublereal)
  281.         );
  282.     do_fio(&c__1, (char *)&rnew, (ftnlen)sizeof(doublereal));
  283.     e_wsfe();
  284. /*<    31 format(1x,a8,1p6d11.3) >*/
  285. /*<    40 loc=nodplc(loc) >*/
  286. L40:
  287.     loc = nodplc[loc - 1];
  288. /*<       go to 10 >*/
  289.     goto L10;
  290.  
  291. /*  diode model */
  292.  
  293. /*<   100 loc=locate(21) >*/
  294. L100:
  295.     loc = cirdat_1.locate[20];
  296. /*<       if (loc.eq.0) go to 200 >*/
  297.     if (loc == 0) {
  298.     goto L200;
  299.     }
  300. /*<       write (iofile,101) >*/
  301.     io__33.ciunit = status_1.iofile;
  302.     s_wsfe(&io__33);
  303.     e_wsfe();
  304. /*<   101 format(//'0**** diode model parameters',/,'0name',9x,'is',9x,'vj', >*/
  305. /*<      1   8x,'cjo',//) >*/
  306. /*<   110 if (loc.eq.0) go to 200 >*/
  307. L110:
  308.     if (loc == 0) {
  309.     goto L200;
  310.     }
  311. /*<       locv=nodplc(loc+1) >*/
  312.     locv = nodplc[loc];
  313. /* ...  is(t2)=is(t1)*dexp(eg/(n*vt)*(t2/t1-1))*(t2/t1)**(xti/n) */
  314. /*<       xn=value(locv+3) >*/
  315.     xn = blank_1.value[locv + 2];
  316. /*<       factor=ratio1*value(locv+8)/(xn*vt)+value(locv+9)/xn*ratlog >*/
  317.     factor = ratio1 * blank_1.value[locv + 7] / (xn * status_1.vt) + 
  318.         blank_1.value[locv + 8] / xn * ratlog;
  319. /*<       factor=dexp(factor) >*/
  320.     factor = exp(factor);
  321. /*<       value(locv+1)=value(locv+1)*factor >*/
  322.     blank_1.value[locv] *= factor;
  323. /*<       oldpb=value(locv+6) >*/
  324.     oldpb = blank_1.value[locv + 5];
  325. /*<       pbo=(value(locv+6)-pbfat1)/fact1 >*/
  326.     pbo = (blank_1.value[locv + 5] - pbfat1) / fact1;
  327. /*<       gmaold=(oldpb-pbo)/pbo >*/
  328.     gmaold = (oldpb - pbo) / pbo;
  329. /*<       value(locv+5)=value(locv+5)/(1.0d0+value(locv+7) >*/
  330. /*<      1     *(400.0d-6*(temp1-reftmp)-gmaold)) >*/
  331.     blank_1.value[locv + 4] /= blank_1.value[locv + 6] * ((temp1 - reftmp) * 
  332.         4e-4 - gmaold) + 1.;
  333. /*<   120 value(locv+6)=fact2*pbo+pbfact >*/
  334. /* L120: */
  335.     blank_1.value[locv + 5] = fact2 * pbo + pbfact;
  336. /*<       gmanew=(value(locv+6)-pbo)/pbo >*/
  337.     gmanew = (blank_1.value[locv + 5] - pbo) / pbo;
  338. /*<       value(locv+5)=value(locv+5) >*/
  339. /*<      1   *(1.0d0+value(locv+7)*(400.0d-6*dtemp-gmanew)) >*/
  340.     blank_1.value[locv + 4] *= blank_1.value[locv + 6] * (dtemp * 4e-4 - 
  341.         gmanew) + 1.;
  342. /*<       pbrat=value(locv+6)/oldpb >*/
  343.     pbrat = blank_1.value[locv + 5] / oldpb;
  344. /*<       value(locv+12)=value(locv+12)*pbrat >*/
  345.     blank_1.value[locv + 11] *= pbrat;
  346. /*<       value(locv+15)=value(locv+15)*pbrat >*/
  347.     blank_1.value[locv + 14] *= pbrat;
  348. /*<       vte=value(locv+3)*vt >*/
  349.     vte = blank_1.value[locv + 2] * status_1.vt;
  350. /*<       value(locv+18)=vte*dlog(vte/(root2*value(locv+1))) >*/
  351.     blank_1.value[locv + 17] = vte * log(vte / (knstnt_1.root2 * 
  352.         blank_1.value[locv]));
  353. /*<       write (iofile,31) value(locv),value(locv+1),value(locv+6), >*/
  354. /*<      1                  value(locv+5) >*/
  355.     io__42.ciunit = status_1.iofile;
  356.     s_wsfe(&io__42);
  357.     do_fio(&c__1, (char *)&blank_1.value[locv - 1], (ftnlen)sizeof(doublereal)
  358.         );
  359.     do_fio(&c__1, (char *)&blank_1.value[locv], (ftnlen)sizeof(doublereal));
  360.     do_fio(&c__1, (char *)&blank_1.value[locv + 5], (ftnlen)sizeof(doublereal)
  361.         );
  362.     do_fio(&c__1, (char *)&blank_1.value[locv + 4], (ftnlen)sizeof(doublereal)
  363.         );
  364.     e_wsfe();
  365. /*<       loc=nodplc(loc) >*/
  366.     loc = nodplc[loc - 1];
  367. /*<       go to 110 >*/
  368.     goto L110;
  369.  
  370. /*  bipolar transistor model */
  371.  
  372. /*<   200 loc=locate(22) >*/
  373. L200:
  374.     loc = cirdat_1.locate[21];
  375. /*<       if (loc.eq.0) go to 300 >*/
  376.     if (loc == 0) {
  377.     goto L300;
  378.     }
  379. /*<       write (iofile,201) >*/
  380.     io__43.ciunit = status_1.iofile;
  381.     s_wsfe(&io__43);
  382.     e_wsfe();
  383. /*<   201 format(//'0**** bjt model parameters',/,'0name',9x,'js',8x,'bf ', >*/
  384. /*<      1   7x,'ise',7x,'br ',7x,'isc',7x,'vje',7x,'cje',7x,'vjc', >*/
  385. /*<      2   7x,'cjc',//) >*/
  386. /*<   210 if (loc.eq.0) go to 300 >*/
  387. L210:
  388.     if (loc == 0) {
  389.     goto L300;
  390.     }
  391. /*<       locv=nodplc(loc+1) >*/
  392.     locv = nodplc[loc];
  393. /* ...  is(t2)=is(t1)*dexp(eg/vt*(t2/t1-1))*(t2/t1)**xti */
  394. /*<       factln=ratio1*value(locv+42)/vt+value(locv+43)*ratlog >*/
  395.     factln = ratio1 * blank_1.value[locv + 41] / status_1.vt + blank_1.value[
  396.         locv + 42] * ratlog;
  397. /*<       factor=dexp(factln) >*/
  398.     factor = exp(factln);
  399. /*<       value(locv+1)=value(locv+1)*factor >*/
  400.     blank_1.value[locv] *= factor;
  401. /*<       tb=value(locv+41) >*/
  402.     tb = blank_1.value[locv + 40];
  403. /*<       bfactr=dexp(tb*ratlog) >*/
  404.     bfactr = exp(tb * ratlog);
  405. /*<       value(locv+2)=value(locv+2)*bfactr >*/
  406.     blank_1.value[locv + 1] *= bfactr;
  407. /*<       value(locv+8)=value(locv+8)*bfactr >*/
  408.     blank_1.value[locv + 7] *= bfactr;
  409. /*<       value(locv+6)=value(locv+6)*dexp(factln/value(locv+7))/bfactr >*/
  410.     blank_1.value[locv + 5] = blank_1.value[locv + 5] * exp(factln / 
  411.         blank_1.value[locv + 6]) / bfactr;
  412. /*<       value(locv+12)=value(locv+12)*dexp(factln/value(locv+13)) >*/
  413. /*<      1               /bfactr >*/
  414.     blank_1.value[locv + 11] = blank_1.value[locv + 11] * exp(factln / 
  415.         blank_1.value[locv + 12]) / bfactr;
  416. /*<       oldpb=value(locv+22) >*/
  417.     oldpb = blank_1.value[locv + 21];
  418. /*<       pbo=(value(locv+22)-pbfat1)/fact1 >*/
  419.     pbo = (blank_1.value[locv + 21] - pbfat1) / fact1;
  420. /*<       gmaold=(oldpb-pbo)/pbo >*/
  421.     gmaold = (oldpb - pbo) / pbo;
  422. /*<       value(locv+21)=value(locv+21)/(1.0d0+value(locv+23) >*/
  423. /*<      1     *(400.0d-6*(temp1-reftmp)-gmaold)) >*/
  424.     blank_1.value[locv + 20] /= blank_1.value[locv + 22] * ((temp1 - reftmp) *
  425.          4e-4 - gmaold) + 1.;
  426. /*<   220 value(locv+22)=fact2*pbo+pbfact >*/
  427. /* L220: */
  428.     blank_1.value[locv + 21] = fact2 * pbo + pbfact;
  429. /*<       gmanew=(value(locv+22)-pbo)/pbo >*/
  430.     gmanew = (blank_1.value[locv + 21] - pbo) / pbo;
  431. /*<       value(locv+21)=value(locv+21) >*/
  432. /*<      1   *(1.0d0+value(locv+23)*(400.0d-6*dtemp-gmanew)) >*/
  433.     blank_1.value[locv + 20] *= blank_1.value[locv + 22] * (dtemp * 4e-4 - 
  434.         gmanew) + 1.;
  435. /*<       pbrat=value(locv+22)/oldpb >*/
  436.     pbrat = blank_1.value[locv + 21] / oldpb;
  437. /*<       value(locv+46)=value(locv+46)*pbrat >*/
  438.     blank_1.value[locv + 45] *= pbrat;
  439. /*<       value(locv+47)=value(locv+47)*pbrat >*/
  440.     blank_1.value[locv + 46] *= pbrat;
  441. /*<       oldpb=value(locv+30) >*/
  442.     oldpb = blank_1.value[locv + 29];
  443. /*<       pbo=(value(locv+30)-pbfat1)/fact1 >*/
  444.     pbo = (blank_1.value[locv + 29] - pbfat1) / fact1;
  445. /*<       gmaold=(oldpb-pbo)/pbo >*/
  446.     gmaold = (oldpb - pbo) / pbo;
  447. /*<       value(locv+29)=value(locv+29)/(1.0d0+value(locv+31) >*/
  448. /*<      1     *(400.0d-6*(temp1-reftmp)-gmaold)) >*/
  449.     blank_1.value[locv + 28] /= blank_1.value[locv + 30] * ((temp1 - reftmp) *
  450.          4e-4 - gmaold) + 1.;
  451. /*<   230 value(locv+30)=fact2*pbo+pbfact >*/
  452. /* L230: */
  453.     blank_1.value[locv + 29] = fact2 * pbo + pbfact;
  454. /*<       gmanew=(value(locv+30)-pbo)/pbo >*/
  455.     gmanew = (blank_1.value[locv + 29] - pbo) / pbo;
  456. /*<       value(locv+29)=value(locv+29) >*/
  457. /*<      1   *(1.0d0+value(locv+31)*(400.0d-6*dtemp-gmanew)) >*/
  458.     blank_1.value[locv + 28] *= blank_1.value[locv + 30] * (dtemp * 4e-4 - 
  459.         gmanew) + 1.;
  460. /*<       pbrat=value(locv+30)/oldpb >*/
  461.     pbrat = blank_1.value[locv + 29] / oldpb;
  462. /*<       value(locv+50)=value(locv+50)*pbrat >*/
  463.     blank_1.value[locv + 49] *= pbrat;
  464. /*<       value(locv+51)=value(locv+51)*pbrat >*/
  465.     blank_1.value[locv + 50] *= pbrat;
  466. /*<       value(locv+54)=vt*dlog(vt/(root2*value(locv+1))) >*/
  467.     blank_1.value[locv + 53] = status_1.vt * log(status_1.vt / (
  468.         knstnt_1.root2 * blank_1.value[locv]));
  469. /*<       write (iofile,211) value(locv),value(locv+1),value(locv+2), >*/
  470. /*<      1   value(locv+6),value(locv+8),value(locv+12),value(locv+22), >*/
  471. /*<      2   value(locv+21),value(locv+30),value(locv+29) >*/
  472.     io__47.ciunit = status_1.iofile;
  473.     s_wsfe(&io__47);
  474.     do_fio(&c__1, (char *)&blank_1.value[locv - 1], (ftnlen)sizeof(doublereal)
  475.         );
  476.     do_fio(&c__1, (char *)&blank_1.value[locv], (ftnlen)sizeof(doublereal));
  477.     do_fio(&c__1, (char *)&blank_1.value[locv + 1], (ftnlen)sizeof(doublereal)
  478.         );
  479.     do_fio(&c__1, (char *)&blank_1.value[locv + 5], (ftnlen)sizeof(doublereal)
  480.         );
  481.     do_fio(&c__1, (char *)&blank_1.value[locv + 7], (ftnlen)sizeof(doublereal)
  482.         );
  483.     do_fio(&c__1, (char *)&blank_1.value[locv + 11], (ftnlen)sizeof(
  484.         doublereal));
  485.     do_fio(&c__1, (char *)&blank_1.value[locv + 21], (ftnlen)sizeof(
  486.         doublereal));
  487.     do_fio(&c__1, (char *)&blank_1.value[locv + 20], (ftnlen)sizeof(
  488.         doublereal));
  489.     do_fio(&c__1, (char *)&blank_1.value[locv + 29], (ftnlen)sizeof(
  490.         doublereal));
  491.     do_fio(&c__1, (char *)&blank_1.value[locv + 28], (ftnlen)sizeof(
  492.         doublereal));
  493.     e_wsfe();
  494. /*<   211 format(1x,a8,1p9d10.3) >*/
  495. /*<       loc=nodplc(loc) >*/
  496.     loc = nodplc[loc - 1];
  497. /*<       go to 210 >*/
  498.     goto L210;
  499.  
  500. /*  jfet model */
  501.  
  502. /*<   300 loc=locate(23) >*/
  503. L300:
  504.     loc = cirdat_1.locate[22];
  505. /*<       if (loc.eq.0) go to 400 >*/
  506.     if (loc == 0) {
  507.     goto L400;
  508.     }
  509. /*<       write (iofile,301) >*/
  510.     io__48.ciunit = status_1.iofile;
  511.     s_wsfe(&io__48);
  512.     e_wsfe();
  513. /*<   301 format(//'0**** jfet model parameters',/,'0name',9x,'is',9x,'pb', >*/
  514. /*<      1   8x,'cgs',8x,'cgd',//) >*/
  515. /*<   310 if (loc.eq.0) go to 400 >*/
  516. L310:
  517.     if (loc == 0) {
  518.     goto L400;
  519.     }
  520. /*<       locv=nodplc(loc+1) >*/
  521.     locv = nodplc[loc];
  522. /*<       value(locv+9)=value(locv+9)*dexp(ratio1*1.11d0/vt) >*/
  523.     blank_1.value[locv + 8] *= exp(ratio1 * 1.11 / status_1.vt);
  524. /*<       oldpb=value(locv+8) >*/
  525.     oldpb = blank_1.value[locv + 7];
  526. /*<       pbo=(value(locv+8)-pbfat1)/fact1 >*/
  527.     pbo = (blank_1.value[locv + 7] - pbfat1) / fact1;
  528. /*<       gmaold=(oldpb-pbo)/pbo >*/
  529.     gmaold = (oldpb - pbo) / pbo;
  530. /*<       oldcjf=1.0d0+0.5d0*(400.0d-6*(temp1-reftmp)-gmaold) >*/
  531.     oldcjf = ((temp1 - reftmp) * 4e-4 - gmaold) * .5 + 1.;
  532. /*<       value(locv+6)=value(locv+6)/oldcjf >*/
  533.     blank_1.value[locv + 5] /= oldcjf;
  534. /*<       value(locv+7)=value(locv+7)/oldcjf >*/
  535.     blank_1.value[locv + 6] /= oldcjf;
  536. /*<   320 value(locv+8)=fact2*pbo+pbfact >*/
  537. /* L320: */
  538.     blank_1.value[locv + 7] = fact2 * pbo + pbfact;
  539. /*<       gmanew=(value(locv+8)-pbo)/pbo >*/
  540.     gmanew = (blank_1.value[locv + 7] - pbo) / pbo;
  541. /*<       cjfact=1.0d0+0.5d0*(400.0d-6*dtemp-gmanew) >*/
  542.     cjfact = (dtemp * 4e-4 - gmanew) * .5 + 1.;
  543. /*<       value(locv+6)=value(locv+6)*cjfact >*/
  544.     blank_1.value[locv + 5] *= cjfact;
  545. /*<       value(locv+7)=value(locv+7)*cjfact >*/
  546.     blank_1.value[locv + 6] *= cjfact;
  547. /*<       pbrat=value(locv+8)/oldpb >*/
  548.     pbrat = blank_1.value[locv + 7] / oldpb;
  549. /*<       value(locv+12)=value(locv+12)*pbrat >*/
  550.     blank_1.value[locv + 11] *= pbrat;
  551. /*<       value(locv+13)=value(locv+13)*pbrat >*/
  552.     blank_1.value[locv + 12] *= pbrat;
  553. /*<       value(locv+16)=vt*dlog(vt/(root2*value(locv+9))) >*/
  554.     blank_1.value[locv + 15] = status_1.vt * log(status_1.vt / (
  555.         knstnt_1.root2 * blank_1.value[locv + 8]));
  556. /*<       write (iofile,31) value(locv),value(locv+9),value(locv+8), >*/
  557. /*<      1   value(locv+6),value(locv+7) >*/
  558.     io__51.ciunit = status_1.iofile;
  559.     s_wsfe(&io__51);
  560.     do_fio(&c__1, (char *)&blank_1.value[locv - 1], (ftnlen)sizeof(doublereal)
  561.         );
  562.     do_fio(&c__1, (char *)&blank_1.value[locv + 8], (ftnlen)sizeof(doublereal)
  563.         );
  564.     do_fio(&c__1, (char *)&blank_1.value[locv + 7], (ftnlen)sizeof(doublereal)
  565.         );
  566.     do_fio(&c__1, (char *)&blank_1.value[locv + 5], (ftnlen)sizeof(doublereal)
  567.         );
  568.     do_fio(&c__1, (char *)&blank_1.value[locv + 6], (ftnlen)sizeof(doublereal)
  569.         );
  570.     e_wsfe();
  571. /*<       loc=nodplc(loc) >*/
  572.     loc = nodplc[loc - 1];
  573. /*<       go to 310 >*/
  574.     goto L310;
  575.  
  576. /*  mosfet model */
  577.  
  578. /*<   400 loc=locate(24) >*/
  579. L400:
  580.     loc = cirdat_1.locate[23];
  581. /*<       iprnt=1 >*/
  582.     iprnt = 1;
  583. /*<   410 if (loc.eq.0) go to 1000 >*/
  584. L410:
  585.     if (loc == 0) {
  586.     goto L1000;
  587.     }
  588. /*<       locv=nodplc(loc+1) >*/
  589.     locv = nodplc[loc];
  590. /*<       type=nodplc(loc+2) >*/
  591.     type = (doublereal) nodplc[loc + 1];
  592. /*<       if(iprnt.ne.0) write (iofile,401) >*/
  593.     if (iprnt != 0) {
  594.     io__54.ciunit = status_1.iofile;
  595.     s_wsfe(&io__54);
  596.     e_wsfe();
  597.     }
  598. /*<   401 format(//'0**** mosfet model parameters',/,'0name',8x,'vto',8x, >*/
  599. /*<      1   'phi',9x,'pb',7x,'is(js)',7x,'kp',9x,'uo'//) >*/
  600. /*<       iprnt=0 >*/
  601.     iprnt = 0;
  602. /*<       ratio4=ratio*dsqrt(ratio) >*/
  603.     ratio4 = ratio * sqrt(ratio);
  604. /*<       value(locv+3)=value(locv+3)/ratio4 >*/
  605.     blank_1.value[locv + 2] /= ratio4;
  606. /*<       value(locv+29)=value(locv+29)/ratio4 >*/
  607.     blank_1.value[locv + 28] /= ratio4;
  608. /*<       oldphi=value(locv+5) >*/
  609.     oldphi = blank_1.value[locv + 4];
  610. /*<       phio=(value(locv+5)-pbfat1)/fact1 >*/
  611.     phio = (blank_1.value[locv + 4] - pbfat1) / fact1;
  612. /*<   415 value(locv+5)=fact2*phio+pbfact >*/
  613. /* L415: */
  614.     blank_1.value[locv + 4] = fact2 * phio + pbfact;
  615. /*<       phi=value(locv+5) >*/
  616.     phi = blank_1.value[locv + 4];
  617. /*<       vfb=value(locv+44)-type*0.5d0*oldphi >*/
  618.     vfb = blank_1.value[locv + 43] - type * .5 * oldphi;
  619. /*<       vfb=vfb+0.5d0*(oldeg-egfet) >*/
  620.     vfb += (oldeg - status_1.egfet) * .5;
  621. /*<       value(locv+44)=vfb+type*0.5d0*phi >*/
  622.     blank_1.value[locv + 43] = vfb + type * .5 * phi;
  623. /*<       value(locv+2)=value(locv+44)+type*value(locv+4)*dsqrt(phi) >*/
  624.     blank_1.value[locv + 1] = blank_1.value[locv + 43] + type * blank_1.value[
  625.         locv + 3] * sqrt(phi);
  626. /*<       value(locv+11)=value(locv+11)*dexp(-egfet/vt+oldeg/oldvt) >*/
  627.     blank_1.value[locv + 10] *= exp(-status_1.egfet / status_1.vt + oldeg / 
  628.         oldvt);
  629. /*<       value(locv+21)=value(locv+21)*dexp(-egfet/vt+oldeg/oldvt) >*/
  630.     blank_1.value[locv + 20] *= exp(-status_1.egfet / status_1.vt + oldeg / 
  631.         oldvt);
  632. /*<       oldpb=value(locv+12) >*/
  633.     oldpb = blank_1.value[locv + 11];
  634. /*<       pbo=(value(locv+12)-pbfat1)/fact1 >*/
  635.     pbo = (blank_1.value[locv + 11] - pbfat1) / fact1;
  636. /*<       gmaold=(oldpb-pbo)/pbo >*/
  637.     gmaold = (oldpb - pbo) / pbo;
  638. /*<       coeold=1.0d0+value(locv+18)*(400.0d-6*(temp1-reftmp)-gmaold) >*/
  639.     coeold = blank_1.value[locv + 17] * ((temp1 - reftmp) * 4e-4 - gmaold) + 
  640.         1.;
  641. /*<       value(locv+9)=value(locv+9)/coeold >*/
  642.     blank_1.value[locv + 8] /= coeold;
  643. /*<       value(locv+10)=value(locv+10)/coeold >*/
  644.     blank_1.value[locv + 9] /= coeold;
  645. /*<       value(locv+17)=value(locv+17)/coeold >*/
  646.     blank_1.value[locv + 16] /= coeold;
  647. /*<       value(locv+19)=value(locv+19)/(1.0d0+value(locv+20) >*/
  648. /*<      1     *(400.0d-6*(temp1-reftmp)-gmaold)) >*/
  649.     blank_1.value[locv + 18] /= blank_1.value[locv + 19] * ((temp1 - reftmp) *
  650.          4e-4 - gmaold) + 1.;
  651. /*<   420 value(locv+12)=fact2*pbo+pbfact >*/
  652. /* L420: */
  653.     blank_1.value[locv + 11] = fact2 * pbo + pbfact;
  654. /*<       gmanew=(value(locv+12)-pbo)/pbo >*/
  655.     gmanew = (blank_1.value[locv + 11] - pbo) / pbo;
  656. /*<       coenew=1.0d0+value(locv+18)*(400.0d-6*dtemp-gmanew) >*/
  657.     coenew = blank_1.value[locv + 17] * (dtemp * 4e-4 - gmanew) + 1.;
  658. /*<       value(locv+9)=value(locv+9)*coenew >*/
  659.     blank_1.value[locv + 8] *= coenew;
  660. /*<       value(locv+10)=value(locv+10)*coenew >*/
  661.     blank_1.value[locv + 9] *= coenew;
  662. /*<       value(locv+17)=value(locv+17)*coenew >*/
  663.     blank_1.value[locv + 16] *= coenew;
  664. /*<       value(locv+19)=value(locv+19)* >*/
  665. /*<      1   (1.0d0+value(locv+20)*(400.0d-6*dtemp-gmanew)) >*/
  666.     blank_1.value[locv + 18] *= blank_1.value[locv + 19] * (dtemp * 4e-4 - 
  667.         gmanew) + 1.;
  668. /*<       pbrat=value(locv+12)/oldpb >*/
  669.     pbrat = blank_1.value[locv + 11] / oldpb;
  670. /*<       value(locv+37)=value(locv+37)*pbrat >*/
  671.     blank_1.value[locv + 36] *= pbrat;
  672. /*<       value(locv+38)=value(locv+38)*pbrat >*/
  673.     blank_1.value[locv + 37] *= pbrat;
  674. /*<       csat=dmax1(value(locv+11),value(locv+21)) >*/
  675. /* Computing MAX */
  676.     d_1 = blank_1.value[locv + 10], d_2 = blank_1.value[locv + 20];
  677.     csat = max(d_2,d_1);
  678. /*<       write (iofile,31) value(locv),value(locv+2),value(locv+5), >*/
  679. /*<      1   value(locv+12),csat,value(locv+3),value(locv+29) >*/
  680.     io__63.ciunit = status_1.iofile;
  681.     s_wsfe(&io__63);
  682.     do_fio(&c__1, (char *)&blank_1.value[locv - 1], (ftnlen)sizeof(doublereal)
  683.         );
  684.     do_fio(&c__1, (char *)&blank_1.value[locv + 1], (ftnlen)sizeof(doublereal)
  685.         );
  686.     do_fio(&c__1, (char *)&blank_1.value[locv + 4], (ftnlen)sizeof(doublereal)
  687.         );
  688.     do_fio(&c__1, (char *)&blank_1.value[locv + 11], (ftnlen)sizeof(
  689.         doublereal));
  690.     do_fio(&c__1, (char *)&csat, (ftnlen)sizeof(doublereal));
  691.     do_fio(&c__1, (char *)&blank_1.value[locv + 2], (ftnlen)sizeof(doublereal)
  692.         );
  693.     do_fio(&c__1, (char *)&blank_1.value[locv + 28], (ftnlen)sizeof(
  694.         doublereal));
  695.     e_wsfe();
  696. /*<   430 loc=nodplc(loc) >*/
  697. /* L430: */
  698.     loc = nodplc[loc - 1];
  699. /*<       go to 410 >*/
  700.     goto L410;
  701.  
  702. /*  finished */
  703.  
  704. /*<  1000 return >*/
  705. L1000:
  706.     return 0;
  707. /*<       end >*/
  708. } /* tmpupd_ */
  709.  
  710. #undef cvalue
  711. #undef nodplc
  712. #undef tmptit
  713.  
  714.  
  715.